iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
SideProject30

以vue.js + node.js 搭建一個客服填單系統系列 第 4

Day 4 資料庫的規劃 基本知識#1

  • 分享至 

  • xImage
  •  

Hi,大家好,
昨天說到了 UML,今天來提到資料庫相關,這次的 side project,預期使用的資料庫是 PostgreSQL,這個資料庫本身是所謂的關聯式資料庫,在這裡簡單的介紹關聯式資料庫的基本知識

表格

表格是關聯式資料庫的重點項目,光是表格就有許多東西可以考慮了,例如說資料怎麼存放?各項資料預期開什麼型態?長度多長?表格本身需不需要設置外來鍵?我們一項一項來說明吧。

欄位

表格本身需要先設定好欄位,常見的欄位有下列幾種,且不同的資料庫可能會有不同的名稱,使用時需要注意。

型態 說明
varchar, char 文字欄位,設定時通常會用 ()指定長度,例如 varchar(50),varchar是所謂的可變長度的欄位,與char最大的差異就是差在 char(50)時,若資料只填入2個字的話,會被補上 48個空白字元,但是varchar則不會補上任何字元
text 不限長度的文字,等同其他資料庫軟體的clob(雖然不限長度,但是還是有一個極限值,就是不能比記憶體大啦XDDD)
integer, bigint, decimal 整數型態,可透過()指定位數,例如 integer(4)表示數值上限為9999。數字本身不會帶小數點,所以在設計時要注意一下,若寫入的資料本身有小數部份,會自動被進位,這3種型態的差異在於數值範圍不同,以integer為例,其數值範圍為 -2147483648 到 +2147483647,雖然數字範圍很大,但是我也遇過破表的數字,所以若有超大數值需要時,可以考慮使用decimal
real, double precision 帶有小數點之數字,與整數型態相同,可使用()來指定位數,但是若設定為 real(5,2)時,表示總長度為 5位,其中有2位數是分給小數部份,也就是說數值上限為 999.99,使用時需注意
numeric 這個型態與oracle 的 number 相同,若不指定範圍時,可以放不限位數的數字(不區分整數與非整數)
bytea 二進制資料,與其他資料庫軟體的 blob ,可以把圖檔、文件檔等非文字資料轉成位元組放進資料庫裡面,但是通常不建議這樣做,因為會加大資料庫的佔用空間,且可能會對版本升級造成困擾

補充:資料表欄位之長度會影響資料查詢的效能、主機硬碟空間的使用量,所以在規劃時,要注意型態與長度的限制,當一個資料庫中不管三七二十一都開text型態的話,會嚴重拖慢資料庫效能

鍵(key)

欄位決定好之後,第二個要設定的東西是資料表的鍵值(key),鍵值分別三種,說明如下

鍵值 說明
主鍵(primary key) 一個表只能有一個,必需唯一,且通常會做為查詢之用的欄位(但是不一定),例如說資料表中有一個不重複流水號欄位,該流水號即可做為主鍵值用。若有複數欄位結合起來的內容是唯一值,亦可做為主鍵值用,稱為複合主鍵。主鍵還有一個用途,是做為其他表格的外鍵之用
唯一鍵(unique key) 資料表中除主鍵之外之唯一值,一般是做為查詢之用,例如使用者資料表中,使用者帳號設為主鍵,但是資料表「員工編號」之欄位,即可將員工編號設為唯一鍵
外鍵(foreign key) 與其他表格做為關聯之鍵值,用做關聯之用

設定key的好處

建立主鍵時,最大的優點就是可以設成其他表格的外鍵,可將關聯建立起來,可保護資料的可用性,稍候於關聯部份詳細說明。
建立唯一鍵時,可避免資料重複輸入問題,且這幾年的做法

索引

建立表格時,若指定索引欄位,可加快查詢速度,實測結果差異可到 60倍以上(血淋淋的教訓@@),且資料越多越有感,但是會稍微減慢資料寫入速度,因為索引的原理是會將索引資料另存一份出來,所以在寫入時,等同會寫入2次以上的資料,故索引在使用上是必用,但是也不能誤用。
補充:通常會是由DBA設定索引後,程式需按照索引的欄位來寫查詢功能

關聯

此為關聯式資料庫的重點,關聯的設計會影響到資料庫的寫入與查找功能,關聯分成三種,分別為

關聯 說明
一對一 例如電商系統中,一個帳號只能有一個購物車資料,或是會計系統中,一個公司只能有一個帳本資料等情形
一對多 例如電商系統中,一個帳號可以有多筆訂單資料,此為一對多關聯
多對多 例如電商系統中,一個帳號可以買多個產品,但是反過來同一個產品可被不同帳號購買。一般多對多的狀況下是無法進行資料處理的,解決方法是拆分成數個一對多的關聯來處理
在關聯式資料庫中,A表格的主鍵即為B表格的外鍵,例如人事系統中,部門表的主鍵為部門ID,人事聘僱表中的主鍵為職員ID,但是該表中可以加開部門ID做為外鍵,此時就把資料庫關聯建立起來了

建立關聯的好處

  1. 可將資料分開存放,且維持資料的正確性,以校務系統為例,將課程資料與學生資料分開建立不同的資料表,並以課程ID做為關聯後,若有需要更改課程資訊時,只要更改課程資料檔即可,若是將學生資料與課程資料合併存放,會造成修改課程名稱時,要一併改動學生資料中的課程名稱。
  2. 若為一對多的關聯,代表有所謂的主從式資料,例如學生資料中,有若干的修課紀錄,若有建立關聯時,即可設定成刪除學生資料時,一併將學生名下的修課紀錄一併刪除掉,避免出現所謂的游離資料。
  3. 同上述例子,也可以設計成學生名下若有修課紀錄時,禁止刪除學生資料,避免被誤刪
  4. 可設定成上層資料修改後,對應的外鍵欄位跟著修改,例如說學生資料表中主鍵為學號,修課紀錄表中以學號做為外鍵,當學號變更時,修課紀錄表中的學號也會自動變更

結語

今天先介紹規劃資料庫的注意項目與資料章的基本知識,以及將關聯的種類與建立關聯的目的稍微進行說明,其實真正的大重點是所謂的六階正規化,但是那個真的有點多,而且了不起用到一半而已,有興趣的看倌可以去了解一下。
明天會進行資料庫剩下項目的教學、簡單的提一下SQL,並且繪製本次side project 的實體關聯圖。那就明日待續吧XDDD


上一篇
UML的使用
下一篇
資料庫操作篇part2
系列文
以vue.js + node.js 搭建一個客服填單系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言